package es.javamyadmin.dao;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Collection;

import es.javamyadmin.modelo.Tables;



/**
 * Clase con los distintos metodos  para hacer query personalizadas
 * @author Emilio Javier Castillo Gonzalez
 * @author Hector Delgado Duran
 *
 */
public class QueryDAO {
	Connection conexion = null;
	Statement estamento = null;
	PreparedStatement preparada = null;
	ResultSet resultado = null;
	InputStream path = null;
	Collection<Tables> tabla;
	
	/**
	 * Metodo que llama a consultarTabla
	 * @param user
	 * @param pass
	 * @param host
	 * @param port
	 * @param database
	 * @param table
	 * @param query
	 * @return Error
	 */
	public Error query(String user, String pass, String host, String port, String database, String table, String query){
		Error error = null;
		
		try {
			tabla = consultaTabla(error, user, pass, host, port, database, table, query);
		} finally {
			cerrarConexion();
		}
		return error;
	}

	/**
	 * Metodo que ejecuta la query que le entra por parametro
	 * @param error
	 * @param user
	 * @param pass
	 * @param host
	 * @param port
	 * @param database
	 * @param tabla
	 * @param query
	 * @return Collection
	 */
	public Collection<Tables> consultaTabla(Error error, String user, String pass, String host, String port, String database, String tabla, String query){
		Collection<Tables> listaDeListas = new ArrayList<Tables>();

		try {
      	    Class.forName("com.mysql.jdbc.Driver");
    	    conexion=DriverManager.getConnection("jdbc:mysql://"+host+":"+port+"/"+database, user, pass);
      	    PreparedStatement pstm = conexion.prepareStatement(query);
      	    resultado = pstm.executeQuery();
      	    int numeroColumnas;
      	    boolean primeraVez = true;
			while(resultado.next()){
				numeroColumnas = resultado.getMetaData().getColumnCount();
				if(primeraVez){
					Tables tab1 = new Tables();
					Collection<Tables> cabecera = new ArrayList<Tables>();
					for(int i = 1; i <= numeroColumnas; i++){
						Tables tab = new Tables();
						tab.setContenido(resultado.getMetaData().getColumnName(i));
						cabecera.add(tab);
					}
					tab1.setSelect(cabecera);
					listaDeListas.add(tab1);
					primeraVez = false;
				}
				
				Collection<Tables> listaDatos = new ArrayList<Tables>();
				Tables listaSelect = new Tables();
				for(int i = 1; i <= numeroColumnas; i++){
					Tables tab = new Tables();
					tab.setContenido(resultado.getString(i));
					listaDatos.add(tab);
				}
				listaSelect.setSelect(listaDatos);
				listaDeListas.add(listaSelect);
			}
		} catch(SQLException ex){
			ex.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			cerrarConexion();
		}
		
		return listaDeListas;		
	}
	
	/**
	 * Metodo que cierra la conexion a la base de datos
	 */
	public void cerrarConexion(){
		if(resultado != null){
			try {
				resultado.close();
			} catch(SQLException e){
				e.printStackTrace();
			}
			resultado = null;
		}
		if(estamento != null){
			try {
				estamento.close();
			} catch(SQLException e){
				e.printStackTrace();
			}
			estamento = null;
		}
		if(preparada != null){
			try {
				preparada.close();
			} catch(SQLException e){
				e.printStackTrace();
			}
			preparada = null;
		}
		if(conexion != null){
			try {
				conexion.close();
			} catch(SQLException e){
				e.printStackTrace();
			}
			conexion = null;
		}
	}

	/**
	 * @return the path
	 */
	public InputStream getPath() {
		return path;
	}

	/**
	 * @param path the path to set
	 */
	public void setPath(InputStream path) {
		this.path = path;
	}


}
